﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Tibet.Logica.Comandos;
using Tibet.Logica.FabricaLogica;
using Logica.Comandos.ComandoAdministracionProyecto;
using Tibet.Entidades.FabricaEntidades;
using Tibet.Entidades;
using Tibet.Logica.Comandos.ComandoAdministracionProyecto;

namespace Tibet.Pruebas.PruebasAdministracionProyecto
{
    [TestFixture]
    public class PruebaProyecto
    {
        [TestCase]
        public void PruebaArchivarUnProyecto()
        {
            int id = 1;
            string cadena = "Culminado";

            // Reviso que el proyecto que voy a archivar este activo
            Comando comando = FabricaComandoProyecto.ObtenerComandoConsultarProyectosPorId();
            comando.Id = id;
            (comando as ConsultarProyectoPorId).Ejecutar();
            Assert.AreEqual((comando.Entidad as Proyecto).Estatus, "activo"); 

            // Archivo el Proyecto, Esto incluye modificacion del tipo a Culminado e insersion de una fecha de culminacion
            comando = FabricaComandoProyecto.ObtenerComandoArchivarProyecto();
            (comando as ArchivarProyecto).Ejecutar();

            // Reviso que se haya modificado
            comando = FabricaComandoProyecto.ObtenerComandoConsultarProyectosPorId();
            (comando as ConsultarProyectoPorId).Ejecutar();
            Assert.AreEqual((comando.Entidad as Proyecto).Estatus, cadena);

            //Si archivo entonces inserto en la tabla de Fecha la fecha de culminacion con la fecha de hoy
            comando = FabricaComandoProyecto.ObtenerComandoConsultarFecha();
            comando.Cadena = cadena;
            (comando as ConsultarFechaPorProyecto).Ejecutar();
            Assert.AreEqual((comando.Entidad as Fecha).Fecha1,DateTime.Today);
            Assert.AreEqual((comando.Entidad as Fecha).Tipo, cadena);
        }

        [TestCase]
        public void PruebaModificarUnProyecto()
        {
            Entidad proyecto = FabricaEntidades.ObtenerProyecto();
            Entidad proyecto2 = FabricaEntidades.ObtenerProyecto();
            string cadena = "Modificacion";

            (proyecto as Proyecto).Nombre = "Prueba Unitaria";
            (proyecto as Proyecto).Ruta = "C:/Algo";
            (proyecto as Proyecto).Id = 1;
            (proyecto as Proyecto).Estatus = "activo";
            (proyecto as Proyecto).Dias = 15;
            (proyecto as Proyecto).IdPerfilMetrica = 2;

            Comando comando = FabricaComandoProyecto.ObtenerComandoInsertarProyectoModificado();
            comando.Entidad = proyecto;
            (comando as InsertarProyectoModificado).Ejecutar();
            
            Comando comando1 = FabricaComandoProyecto.ObtenerComandoConsultarProyectosPorId();
            (comando1 as ConsultarProyectoPorId).Ejecutar();
            proyecto2 = comando1.Entidad;
            Assert.AreEqual((proyecto as Proyecto).Nombre, (proyecto2 as Proyecto).Nombre);
            Assert.AreEqual((proyecto as Proyecto).Ruta, (proyecto2 as Proyecto).Ruta);
            Assert.AreEqual((proyecto as Proyecto).Estatus, (proyecto2 as Proyecto).Estatus);
            Assert.AreEqual((proyecto as Proyecto).Dias, (proyecto2 as Proyecto).Dias);
            Assert.AreEqual((proyecto as Proyecto).IdPerfilMetrica,(proyecto2 as Proyecto).IdPerfilMetrica);
            

            //Reviso que haya insertado en la tabla fecha
            comando = FabricaComandoProyecto.ObtenerComandoConsultarFecha();
            comando.Cadena = cadena;
            (comando as ConsultarFechaPorProyecto).Ejecutar();
            Assert.AreEqual((comando.Entidad as Fecha).Fecha1, DateTime.Today);
            Assert.AreEqual((comando.Entidad as Fecha).Tipo, cadena);
            
        }
        [TestCase]
        public void InsertarProyecto()
        {

            Entidad proyecto = FabricaEntidades.ObtenerProyecto();
            Entidad proyecto2 = FabricaEntidades.ObtenerProyecto();

            (proyecto as Proyecto).Nombre = "Prueba Unitaria";
            (proyecto as Proyecto).Ruta = "C:/Prueba";
            (proyecto as Proyecto).Estatus = "activo";
            (proyecto as Proyecto).Dias = 15;
            (proyecto as Proyecto).IdCliente = 1;
            (proyecto as Proyecto).IdPerfilMetrica = 2;
            (proyecto as Proyecto).IdPerfilRegla = 1;

            // comando para inserta en proyecto

            Comando comandoproyecto = FabricaComandoProyecto.ObtenerComandoInsertarProyecto();
            comandoproyecto.Entidad = proyecto;
            Boolean respuestaProyecto = false;
            (comandoproyecto as InsertarProyectoNuevo).Ejecutar();
            respuestaProyecto = comandoproyecto.Flag;

            // comando para obtener el id
            comandoproyecto = FabricaComandoProyecto.ObtenerUltimoProyecto();
            comandoproyecto.Entidad = proyecto;
            int id;
            (comandoproyecto as ConsultarUltimoProyecto).Ejecutar();
            id = comandoproyecto.Id;

            // comando para inserta en fecha

            Entidad fechaproyecto = FabricaEntidades.ObtenerFecha();
            Comando comandoFecha = FabricaComandoProyecto.ObtenerComandoInsertarFecha();

            comandoFecha.Id = id;
            (comandoFecha as InsertarFechaDeProyecto).Ejecutar();
            respuestaProyecto = comandoFecha.Flag;

            proyecto2 = comandoproyecto.Entidad;
            Assert.AreEqual((proyecto as Proyecto).Nombre, (proyecto as Proyecto).Nombre);
            Assert.AreEqual((proyecto as Proyecto).Ruta, (proyecto2 as Proyecto).Ruta);
            Assert.AreEqual((proyecto as Proyecto).Estatus, (proyecto2 as Proyecto).Estatus);
            Assert.AreEqual((proyecto as Proyecto).Dias, (proyecto2 as Proyecto).Dias);
            Assert.AreEqual((proyecto as Proyecto).IdPerfilMetrica, (proyecto2 as Proyecto).IdPerfilMetrica);
            Assert.AreEqual((proyecto as Proyecto).IdPerfilRegla, (proyecto2 as Proyecto).IdPerfilRegla);
            Assert.AreEqual((proyecto as Proyecto).IdCliente, (proyecto2 as Proyecto).IdCliente);



            //Reviso que haya insertado en la tabla fecha
            comandoproyecto = FabricaComandoProyecto.ObtenerComandoInsertarFecha();
            comandoproyecto.Flag = respuestaProyecto;

            (comandoproyecto as InsertarFechaDeProyecto).Ejecutar();

            Assert.AreEqual((comandoproyecto.Entidad as Fecha).Fecha1, DateTime.Today);
            Assert.AreEqual((comandoproyecto.Entidad as Fecha).Tipo,"Creacion");
            Assert.AreEqual((comandoproyecto.Entidad as Fecha).IdProyecto, id);

            // inserta en la tabla de usuario_proyecto


            Entidad usuarioproyecto = FabricaEntidades.ObtenerUsuarioProyecto();
            Entidad proyecto3 = FabricaEntidades.ObtenerUsuarioProyecto();

            (usuarioproyecto as Usuario_Proyecto).Fk_Proyecto_idProyecto = id;
            (usuarioproyecto as Usuario_Proyecto).Fk_Rol_idRol = 1;
            (usuarioproyecto as Usuario_Proyecto).Fk_Usuario_idUsuario = 1;

            Comando comando = FabricaComandoProyecto.ObtenerComandoInsertaUsuarioProyecto();
            (comando as InsertarUsuariosProyecto).Ejecutar();

            proyecto3 = comando.Entidad;

            Assert.AreEqual((proyecto as Usuario_Proyecto).Fk_Usuario_idUsuario, (proyecto3 as Usuario_Proyecto).Fk_Usuario_idUsuario);
            Assert.AreEqual((proyecto as Usuario_Proyecto).Fk_Proyecto_idProyecto, (proyecto3 as Usuario_Proyecto).Fk_Proyecto_idProyecto);
            Assert.AreEqual((proyecto as Usuario_Proyecto).Fk_Rol_idRol, (proyecto3 as Usuario_Proyecto).Fk_Rol_idRol);
        }

    }
} 